package org.dreamfly.core.dao.impl;

import org.dreamfly.core.dao.BaseDAO;
import org.hibernate.Criteria;
import org.hibernate.Query;

import org.hibernate.Session;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import java.io.Serializable;
import java.util.List;

import static org.hibernate.criterion.Restrictions.eq;
import static org.hibernate.criterion.Restrictions.like;
import static org.hibernate.criterion.Restrictions.or;

/**
 *@author Administrator yao已作修改
 */
/**
 * Created by IntelliJ IDEA. User: Gin Date: 2010-9-15 Time: 21:44:29 To change
 * this template use File | Settings | File Templates.
 */
public class BaseDAOImpl<T, PK extends Serializable> extends
		HibernateDaoSupport implements BaseDAO<T, PK> {
	
	/**
	 * 插入数据库的操作
	 */
	public void insert(T obj) {
		/**
		 * 将obj对象变为持久化的状态,该对象的属性将被保存到数据库当中 yao 的判断是属性在外面已经赋值好了的
		 */
		this.getSession().save(obj);
	}

	public void update(T obj) {
		/**
		 * update 用来保存对持久化对象所做的修改
		 */
		Session sess = this.getSession();
		sess.update(obj);
		/**
		 * 产生一个update语句把session缓存里的数据强制刷到数据库里。 这个做法是会降低效率 yao 建议去掉
		 * 让hibernate自己来完成这个工作 Flush()后只是将Hibernate缓存中的数据提交到数据库,如果这时数据库处在一个事物当中,
		 * 则数据库将这些SQL语句缓存起来,当Hibernate进行commit时,会告诉数据库
		 * ,你可以真正提交了,这时数据才会永久保存下来,也就是被持久化了
		 */
		/**
		 * sess.flush();去掉
		 */
	}

	@Override
	public void saveOrUpdate(T obj) {
		/**
		 * 当不知道对象是不是持久化的对象的时候使用此方法
		 */
		Session sess = this.getSession();
		sess.saveOrUpdate(obj);
		// sess.flush();
	}

	public void delete(T obj) {
		Session sess = this.getSession();
		sess.delete(obj);
	    sess.flush();
	}

	@SuppressWarnings("unchecked")
	public T find(Class<T> clazz, PK id) {
		
		T t=(T)this.getSession().get(clazz, id);
		//this.getSession().flush();
		return t;
		/**
		 * load 的方法是可能抛出异常的 HibernateException
		 */
		
		/*try {
			T t = (T) this.getSession().load(clazz, id);
			return t;
		} catch (HibernateException e) {
			// TODO: handle exception
			return null;
		}*/
	}

	@SuppressWarnings("unchecked")
	public List<T> find(Class<T> clazz, String title, int firstRow, int maxRow, String server) {
		/**
		 * &&短路符号    title.length()不会抛出异常(可省掉的)
		 */
		if (title != null && title.length() > 0) {
			/**
			 * 防止title="             "出现
			 */
			title = title.replace(" ", "");
			if (title.length() == 0)
				return null;
		
		} else {
			return null;
		}
		Criteria criteria=this.getSession().createCriteria(clazz);
        criteria.add(or(Restrictions.like("title","%"+title+"%"),Restrictions.like("note","%"+title+"%")));
		criteria.addOrder(Order.asc("title"));
        if(null != server){
            criteria.add(eq("server",server));
        }
	
		/**
		 * 分页？ 需要做一些优化  
		 */
		criteria.setFirstResult(firstRow);
		criteria.setMaxResults(maxRow);
		List<T> list = criteria.list();
		return ((list == null )|| list.isEmpty()) ? null : list;
	}
	
	
	
	@Override
	public List<T> findNative(Class<T> clazz, String title, String serverName, int firstRow,
			int maxRow) {
		/**
		 * &&短路符号    title.length()不会抛出异常(可省掉的)
		 */
		if (title != null && title.length() > 0) {
			/**
			 * 防止title="             "出现
			 */
			title = title.replace(" ", "");
			if (title.length() == 0)
				return null;
		
		} else {
			return null;
		}
		Criteria criteria=this.getSession().createCriteria(clazz);
		criteria.add(or(like("title", "%" + title + "%"),like("note", "%" + title + "%")));
		criteria.add(Restrictions.eq("server", serverName));
		criteria.addOrder(Order.asc("title"));
	
		/**
		 * 分页？ 需要做一些优化  
		 */
		criteria.setFirstResult(firstRow);
		criteria.setMaxResults(maxRow);
		List<T> list = criteria.list();
		return ((list == null )|| list.isEmpty()) ? null : list;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<T> findByExample(T bean) {
		/**
		 * 忽略大小写
		 */
   Example example= Example.create(bean).ignoreCase();
		Criteria criteria = getSession().createCriteria(bean.getClass()).add(example);
		return criteria.list();
	}

	@Override
	public void merge(T obj) {
		this.getSession().merge(obj);
	}

	@SuppressWarnings( { "unchecked", "null" })
	@Override
	/**
	 *发现资源数
	 */
	public Long findCount(Class<T> clazz, String title) {
	/*	String sql = "select count(*) from " + clazz.getName();
		if (title != null && title.length() > 0)
			sql += " where title like '%" + title + "%'";

		List list = this.getSession().createQuery(sql).list();

		return list == null || list.isEmpty() ? 0L : Long.parseLong(list.get(0)
				.toString());*/
		/**
		 * yao 修改如下
		 */
		StringBuffer sql = new StringBuffer();
		sql.append("select count(*) from");
		sql.append(" ");
		sql.append(clazz.getName());
		/**
		 * &&短路符号    title.length()不会抛出异常(可省掉的)
		 */
		if (title != null && title.length() > 0) {
			/**
			 * 防止title="             "出现
			 */
			title = title.replace(" ", "");
			if (title.length() == 0)
				return 0L;
			/**
			 * 如果不是title="   " 则开始查询操作拼接查询语句
			 * 
			 */
			sql.append(" ");
			sql.append("where title like");
			sql.append("'%");
			sql.append(title);
			sql.append("%'");
            sql.append(" or note like");
            sql.append("'%");
			sql.append(title);
			sql.append("%'");
		} else {
			return 0L;
		}
		Query query=this.getSession().createQuery(sql.toString());
		List list=query.list();
		
	    return (((list==null)||list.isEmpty()) ? 0L : (Long)list.get(0));
		
	}
	
    @Override
	public Long findNativeCount(Class<T> clazz, String title, String serverName) {
    	StringBuffer sql = new StringBuffer();
		sql.append("select count(*) from");
		sql.append(" ");
		sql.append(clazz.getName());
		/**
		 * &&短路符号    title.length()不会抛出异常(可省掉的)
		 */
		if (title != null && title.length() > 0) {
			/**
			 * 防止title="             "出现
			 */
			title = title.replace(" ", "");
			if (title.length() == 0)
				return 0L;
			/**
			 * 如果不是title="   " 则开始查询操作拼接查询语句
			 * 
			 */
			sql.append(" ");
			sql.append("where title like");
			sql.append("'%");
			sql.append(title);
			sql.append("%'");
            sql.append(" or note like");
            sql.append("'%");
			sql.append(title);
			sql.append("%'");
			sql.append(" ");
			sql.append("and ");
			sql.append("server = '");
			sql.append(serverName);
			sql.append("'");
			
		} else {
			return 0L;
		}
		Query query=this.getSession().createQuery(sql.toString());
		List list=query.list();
		
	    return (((list==null)||list.isEmpty()) ? 0L : (Long)list.get(0));
	}

	@Override
    public List<T> findAll(Class<T> clazz) {
        return this.getSession().createQuery("from " + clazz.getName()).list();
    }

}
